package day03pm;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * 改造客户端为cs架构模式，连接客户端
 *
 * @author JokerQ
 * @date 2020/8/25 - 13:03
 */
public class Client_v5 implements ActionListener {
    //窗体
    private final JFrame jFrame;
    //聊天内容显示的文本域
    private final JTextArea jTextArea;
    //输入内容的文本框
    private final JTextField jTextField;
    //发送按钮
    private final JButton jButton;
    //用户名标签
    private final JLabel jLabel;
    //用户名
    private final String name;

    private Socket socket;

    private PrintWriter writer;

    private BufferedReader reader;

    public Client_v5() {
        jFrame = new JFrame("聊天室客户端v1.0");
        /*
        JOptionPane
            有助于方便地弹出要求用户提供值或向其发出通知的标准对话框
        showInputDialog
            提示要求某些输入。
         */
        String ip = JOptionPane.showInputDialog(jFrame, "请输入服务器的地址：");
        //ip这行代码写完后，可以运行main方法，演示JOptionPane输入框
        int port = Integer.parseInt(JOptionPane.showInputDialog(jFrame, "请输入端口号："));
        try {
            socket = new Socket(ip, port);
            writer = new PrintWriter(socket.getOutputStream(), true);
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        } catch (IOException e) {
            e.printStackTrace();
        }

        /*
        JTextArea(int rows, int columns)
            构造具有指定行数和列数的新的空 TextArea。
         */
        jTextArea = new JTextArea(20, 40);
        jTextArea.setFont(new Font("宋体", Font.BOLD, 24));
        //设置聊天记录窗口不可编辑
        jTextArea.setEditable(false);


        //文本输入框
        jTextField = new JTextField(30);
        jButton = new JButton("发送");
        name = JOptionPane.showInputDialog(jFrame, "请输入您的姓名：");
        jLabel = new JLabel(name + "：");
        //运行并没有添加到面板，开始引入init方法
        init();
        //调用监听方法
        addEventHandler();

       // new ReadMessageThread().start();

    }



    /**
     * 窗体布局
     */
    private void init() {
        /*
        JScrollPane
            可滚动的面板
         */
        JScrollPane jScrollPane = new JScrollPane(jTextArea);
        jFrame.add(jScrollPane, BorderLayout.CENTER);
        JPanel jPanel = new JPanel();
        jPanel.add(jLabel);
        jPanel.add(jTextField);
        jPanel.add(jButton);
        jFrame.add(jPanel, BorderLayout.SOUTH);
        //运行演示结果
    }

    /**
     * 把写在main方法中的一些对JFrame的设置抽出一个方法
     */
    public void showMe() {
        /*
        pack
            调整此窗口的大小，以适合其子组件的首选大小和布局。
            会显示在左侧
         */
        //jFrame.pack();
        jFrame.setSize(800, 600);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setLocationRelativeTo(null);
        jFrame.setVisible(true);
    }

    /**
     * 将用户输入的信息，发送给服务器
     * @param e
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        //获取用户输入的内容
        String text = jTextField.getText().trim();
        //判断输入信息
        if (text.equals("")){
            JOptionPane.showMessageDialog(jFrame,"不能发送空信息！！！");
            return;
        }
        writer.println(name+"："+text);
        writer.flush();
        //输入框清空
        jTextField.setText("");
    }

    /**
     * 组件监听器
     */
    public void addEventHandler(){
        jButton.addActionListener(this);
        jTextField.addActionListener(this);
    }

  /* class ReadMessageThread extends Thread{
       @Override
       public void run() {
           try {
               String str = reader.readLine();
               jTextArea.append(str);
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }*/
    public void say() throws IOException {
        while (true){
            String str = reader.readLine();
            jTextArea.append(str+'\n');
        }
    }

    public static void main(String[] args) throws IOException {
        Client_v5 client = new Client_v5();
        client.showMe();
        //调用say方法，把客户端的发送内容显示在聊天界面上
        client.say();
    }
}
